import os
import platform
import subprocess
import sys
import shutil
import sysconfig
import importlib.util

def get_module_path(module_name):
    """获取模块的实际安装路径"""
    try:
        spec = importlib.util.find_spec(module_name)
        if spec and spec.origin:
            module_dir = os.path.dirname(spec.origin)
            
            # 对于包，返回包目录
            if os.path.exists(os.path.join(module_dir, '__init__.py')):
                return os.path.dirname(module_dir)
            return module_dir
        return None
    except Exception as e:
        print(f"获取模块路径时出错: {e}")
        return None

def package_application():
    if platform.system() != 'Windows':
        print("错误：此脚本仅支持Windows系统！")
        sys.exit(1)
    
    # 配置参数
    entry_script = 'WhiteGloveVision.py'
    app_name = 'WhiteGloveVision'
    
    # 关键修改：从根目录获取ico文件
    root_dir = os.path.dirname(os.path.abspath(__file__))
    icon_path = os.path.join(root_dir, 'app.ico')
    
    # 清理旧构建
    print("清理旧构建文件...")
    for folder in ['build', 'dist', f'{app_name}_package']:
        if os.path.exists(folder):
            shutil.rmtree(folder, ignore_errors=True)
    
    # 获取虚拟环境的 site-packages 路径
    try:
        site_packages = sysconfig.get_path('purelib')
        print(f"使用的 site-packages 目录: {site_packages}")
    except:
        print("无法获取 site-packages 路径，使用备选方法")
        site_packages = os.path.join(sys.prefix, 'Lib', 'site-packages')
    
    # 构建PyInstaller命令
    cmd = [
        'pyinstaller',
        '--noconfirm',
        '--name', app_name,
        '--distpath', f'{app_name}_package',
        '--workpath', 'build',
        '--specpath', 'build',
        '--windowed',
        '--onedir',
        '--clean',
        '--hidden-import', 'cv2',
        '--hidden-import', 'cv2.data',
        '--hidden-import', 'mediapipe',
        # 排除所有可能导致问题的模块
        '--exclude-module', 'jax',
        '--exclude-module', 'jaxlib',
        '--exclude-module', 'tensorflow',
        '--exclude-module', 'keras',
        '--exclude-module', 'mediapipe.tasks.python.genai',
        '--exclude-module', 'mediapipe.tensorflow',
        '--exclude-module', 'mediapipe.models',
        # 添加必要的收集指令
        '--collect-submodules', 'cv2',
        '--collect-submodules', 'mediapipe',
        # 使用更可靠的添加方式
        '--add-binary', f'{site_packages}/cv2;cv2',
        '--add-binary', f'{site_packages}/mediapipe;mediapipe'
    ]
    
    # 添加图标
    if os.path.exists(icon_path):
        cmd.extend(['--icon', icon_path])
        print(f"添加应用图标: {icon_path}")
    else:
        print(f"警告: 未找到图标文件 {icon_path}，继续打包但不添加图标")
    
    # 添加主脚本
    cmd.append(entry_script)
    
    # 执行打包命令
    print("开始打包应用程序...")
    print("执行命令:", " ".join(cmd))
    try:
        result = subprocess.run(cmd, check=True, text=True, capture_output=True)
        print("打包成功完成！")
    except subprocess.CalledProcessError as e:
        print("打包失败！错误信息：")
        print(e.stdout)
        print(e.stderr)
        sys.exit(1)
    
    # 创建启动脚本
    print("创建启动脚本...")
    launcher_path = os.path.join(f'{app_name}_package', f'启动{app_name}.bat')
    with open(launcher_path, 'w') as f:
        f.write(f"""@echo off
setlocal
set PATH=%~dp0{app_name};%PATH%
start "" "%~dp0{app_name}\\{app_name}.exe"
endlocal
""")
    
    print(f"✅ 打包成功！绿色版文件夹位于: {app_name}_package")
    print(f"请将整个 {app_name}_package 文件夹复制到目标电脑运行")

if __name__ == '__main__':
    package_application()